﻿using System;
using System.IO;
using System.Windows.Forms;

namespace PlatformaNET_lab3
{
    /// <summary>
    /// Reprezentuje główną formę programu
    /// </summary>
    public partial class MainForm : Form
    {
        //private TreeNode _currentNode;
        //private List<ChildForm> child;  //lista przechowywująca formy potomne

        /// <summary>
        /// konstruktor
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
            //child = new List<ChildForm>();
            BuildTreeView();
            var d = new _delegate(BuildTreeView);    //wywołanie delegaty dla zamknięcia okna potomnego
            ChildForm._event += d;
        }

        /// <summary>
        /// Obsługa menu nowy
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void NowyToolStripMenuItemClick(object sender, EventArgs e)
        {
            NewFile();
        }

        /// <summary>
        /// Obłsuga menu otwórz
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OtwórzToolStripMenuItemClick(object sender, EventArgs e)
        {
            OpenFile();
        }

        /// <summary>
        /// Przerysowywuje drzewo otwartych plików
        /// </summary>
        private void BuildTreeView()
        {
            treeView.Nodes.Clear();
            treeView.BeginUpdate();

            TreeNode nodeTxt = treeView.Nodes.Add("Pliki txt");
            nodeTxt.ImageIndex = 0;
            nodeTxt.SelectedImageIndex = 0;
            TreeNode nodeRtf = treeView.Nodes.Add("Pliki rtf");
            nodeRtf.ImageIndex = 1;
            nodeRtf.SelectedImageIndex = 1;

            TreeNode nodeUnassigend = treeView.Nodes.Add("Nieprzypisane");
            nodeUnassigend.ImageIndex = 2;
            nodeUnassigend.SelectedImageIndex = 2;

            LoadNodes(nodeTxt, nodeRtf, nodeUnassigend);

            treeView.EndUpdate();
            treeView.Refresh();
        }

        /// <summary>
        /// Wczytuje do drzewa wszystkie elementy listy
        /// </summary>
        /// <param name="nodeTxt">węzeł dla plików .txt</param>
        /// <param name="nodeRtf">węzeł dla plików .rtf</param>
        private void LoadNodes(TreeNode nodeTxt, TreeNode nodeRtf, TreeNode nodeUn)
        {

            //ChildForm tempChild = null; //wukożystywany podczas usuwanie elementu z listy
            foreach (ChildForm child in MdiChildren)
            {
                if (child.exist)   //czy forma nie została zamknieta
                {
                    var tn = new TreeNode(child._Name);
                    tn.Tag = child;
                    tn.ToolTipText = child.Path;
                    tn.ImageIndex = 2;
                    tn.ContextMenuStrip = contextMenuStrip;
                    child._TreeNode = tn;

                    if (child.ParentId == 0) //plik TXT
                    {
                        nodeTxt.Nodes.Add(tn);
                        //child._TreeNode = tn;
                        
                        //tn.ContextMenuStrip.Visible = true;
                    }
                    if (child.ParentId == 1) //plik RTF
                    {
                        nodeRtf.Nodes.Add(tn);
                        //child._TreeNode = tn;
                        //tn.ContextMenuStrip = contextMenuStrip;
                    }
                    if (child.ParentId == 2) //plik  nieprzypisany
                    {
                        nodeUn.Nodes.Add(tn);
                        //child._TreeNode = tn;
                        //tn.ContextMenuStrip = contextMenuStrip;
                    }
                }
            }
            //if (tempChild != null)
            //    child.Remove(tempChild);
        }

        /// <summary>
        /// Przenosi na wierzch zaznaczonego w drzewie potomka
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void TreeView1AfterSelect(object sender, TreeViewEventArgs e)
        {

            ChildForm tempChild;
            if (e.Node.Tag != null) //czy węzeł ma przypisany jakis element listy
            {
                tempChild = (ChildForm)e.Node.Tag;
                tempChild.BringToFront();
                toolStripStatusLabel.Text = tempChild._Name;

            }
            else
            {
                toolStripStatusLabel.Text = "";
            }

        }


        /// <summary>
        /// Obsługuje menu zapisz
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ZapiszToolStripMenuItemClick(object sender, EventArgs e)
        {
            SaveFile();
        }

        //TODO poprawic 
        void NewFile()
        {
            var child = new ChildForm("Nowy", 2, "brak ścieżki");//, _currentNode);
            child.MdiParent = this;
            child.richTextBox.Rtf = "";
            //child.Text = fileName;
            child.Show();

            BuildTreeView();

            //var childForm = new ChildForm { MdiParent = this };
            //childForm.Show();
        }

        void OpenFile()
        {
            DialogResult dialogResult = openFileDialog.ShowDialog();
            //string text = "";   //przechowuje tekst zawarty w plikach tekstowych
            string fileName = "";   //przechowuje nazwe pliku
            string fileFullName = "";   //przechowuje pelna sciezke do pliku
            var tempRtf = new RichTextBox();    //przechowuje tekst dla richtekst box
            bool boolRtf = false;       //czy otwarty plik to .rtf
            if (dialogResult == DialogResult.OK)
            {
                fileFullName = openFileDialog.FileName;
                fileName = openFileDialog.SafeFileName;

                try//sprobuj wczytac dane do richtextbox
                {
                    tempRtf.LoadFile(fileFullName);
                    boolRtf = true;
                }
                catch
                { }
                if (!boolRtf)   //jesli nie udalo sie wczytac richtextbox, to wczytaj text
                {
                    try
                    {
                        tempRtf.Text = File.ReadAllText(fileFullName);
                    }
                    catch (IOException) { }
                }
            }
            bool czyIstnieje = false;
            //czy plik o podanj sciezce zostal juz otwarty
            if (fileName != "")
            {
                foreach (ChildForm child in MdiChildren)
                {
                    if (child.Path == fileFullName)
                    {
                        czyIstnieje = true;
                    }
                }

                //jesli plik niezostał jescze wczytany, to wczytaj
                if (!czyIstnieje)
                {
                    //pobiera 3 litere od konca
                    //r == rtf
                    //t == txt
                    if (fileName != null)
                    {
                        char tempRodzPliku = fileName[fileName.Length - 3]; //

                        //rodzaj pliku 
                        //0 ==txt
                        //1 == rtf
                        int rodzPliku = 0;
                        if (tempRodzPliku == 'r')
                            rodzPliku = 1;

                        //stworz nowe dziecko
                        var child = new ChildForm(fileName, rodzPliku, fileFullName);//, _currentNode);
                        child.MdiParent = this;
                        child.richTextBox.Rtf = tempRtf.Rtf;
                        //child.Text = fileName;
                        child.Show();
                    }

                    //dodaj do listy
                    //child.Add(_child);
                    BuildTreeView();
                }
            }
        }

        void SaveFile()
        {

        }

        void Print()
        {

        }

        private void BtnNewClick(object sender, EventArgs e)
        {
            NewFile();
        }

        private void BtnOpenClick(object sender, EventArgs e)
        {
            OpenFile();
        }

        private void BtnSaveClick(object sender, EventArgs e)
        {
            SaveFile();
        }

        private void BtnPrintClick(object sender, EventArgs e)
        {
            Print();
        }

        private void DrukujToolStripMenuItemClick(object sender, EventArgs e)
        {
            Print();
        }

        private void ZamknijToolStripMenuItemClick(object sender, EventArgs e)
        {
            Close();
        }

        private void oProgramieToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string _oProgramie = "Przetwarzanie plików tekstowych\n\n" +
                                         "Obsługa plików z rozszerzeniem .txt .rtf\n\n" +
                                         "Autor:  Paweł Cmiel\n" +
                                         "e-mail: pawel.cmiel@gmail.com";
            MessageBox.Show(_oProgramie, "O programie");
        }

        private void PokażToolStripMenuItemClick(object sender, EventArgs e)
        {
            ChildForm tempChild;
            if (treeView.SelectedNode.Tag != null) //czy węzeł ma przypisany jakis element listy
            {
                tempChild = (ChildForm)treeView.SelectedNode.Tag;
                tempChild.BringToFront();
                if (toolStripStatusLabel != null) toolStripStatusLabel.Text = tempChild._Name;
            }
            else
            {
                toolStripStatusLabel.Text = "";
            }

        }


        private void MainForm_MdiChildActivate(object sender, EventArgs e)
        {
            try
            {
                var child = (ChildForm)this.ActiveMdiChild;
                treeView.SelectedNode = child._TreeNode;
            }
            catch
            {
            }
        }


    }
}
